package com.leyou.cart.service;

import com.leyou.cart.entity.Cart;
import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exception.LyException;
import com.leyou.common.threadlocals.UserHolder;
import com.leyou.common.utils.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class CartService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    private final static String CART_KEY = "ly:cart:uid:";

    // 把商品添加到购物车中
    public void addToCart(Cart cart) {
        // 从redis中先获取当前用户的购物车信息
        String key = CART_KEY + UserHolder.getUser().getId();
        BoundHashOperations<String, String, String> hashMap = redisTemplate.boundHashOps(key);
        // 判断商品是否存在购物车中
        String skuId = cart.getSkuId().toString();
        // 获取购物车的数量
        Integer num = cart.getNum();
        // 判断商品是否存在
        Boolean boo = hashMap.hasKey(skuId);
        if(boo!=null && boo){
            // 已经存在：只需要修改数量
            String skuStr = hashMap.get(skuId);
            // 把字符串反序列化成对象
            cart = JsonUtils.toBean(skuStr, Cart.class);
            // 修改缓存中的数量
            cart.setNum(cart.getNum() + num);
        }
        // 添加到redis
        hashMap.put(skuId, JsonUtils.toString(cart));
    }

    public List<Cart> queryCartList() {
        // 从redis中先获取当前用户的购物车信息
        String key = CART_KEY + UserHolder.getUser().getId();
        // 先判断大Key
        Boolean boo = redisTemplate.hasKey(key);
        if(boo==null || !boo){
            // 不存在，直接返回
            throw new LyException(ExceptionEnum.CARTS_NOT_FOUND);
        }
        // 如果存在，获取大key
        BoundHashOperations<String, String, String> hashOps = redisTemplate.boundHashOps(key);
        // 获取购物车中所有的数据
        List<String> values = hashOps.values();
        if(CollectionUtils.isEmpty(values)){
            // 不存在，直接返回
            throw new LyException(ExceptionEnum.CARTS_NOT_FOUND);
        }
        // 购物车中有数据： 把redis中的字符串数据转成Cart对象
        return values.stream().map(c -> JsonUtils.toBean(c, Cart.class)).collect(Collectors.toList());
    }

    // 批量 添加购物车
    public void addCartList(List<Cart> carts) {
        // 为空返回
        if(CollectionUtils.isEmpty(carts)){
            return;
        }
        // 不为空添加
        for (Cart cart : carts) {
            addToCart(cart);
        }
    }
}
